//小蛇的自调用构造函数
(function() {
	//存放小蛇的位置，将来删除小蛇				
	var elements = [];

	//小蛇的构造函数
	function Snake(width, height, direction) {
		//小蛇的每一部分的宽
		this.width = width || 20;
		this.height = height || 20;
		//小蛇的身体，向右方向走的时候，纵坐标是不变的
		this.body = [{
				x: 3,
				y: 2,
				color: "red"
			}, //头
			{
				x: 2,
				y: 2,
				color: "orange"
			}, //身体
			{
				x: 1,
				y: 2,
				color: "orange"
			}, //身体
		];
		this.direction = direction || "right"; //默认方向向右
	}

	//为原型添加方法，初始化小蛇
	Snake.prototype.init = function(map) {
		//先删除之前的小蛇
		remove();
		//循环遍历创建div
		for(var i = 0; i < this.body.length; i++) {
			//body中的每一行元素都能看成一个对象
			var obj = this.body[i];
			//创建div
			var div = document.createElement("div");
			//将div加入到map父级元素中
			map.appendChild(div);
			//设置div的样式
			div.style.position = "absolute";
			div.style.width = this.width + "px";
			div.style.height = this.height + "px";
			//横纵坐标
			div.style.left = obj.x * this.width + "px";
			div.style.top = obj.y * this.height + "px";
			//背景颜色
			div.style.backgroundColor = obj.color;
			//方向老师没说
			//把创建的div加入到数组中，将来删除
			elements.push(div);
		}
	};

	//为原型添加方法，使小蛇动起来
	Snake.prototype.move = function(food, map) {
		//改变小蛇身体的坐标，身体都是跟着前一个div行走的
		//所以，在移动的时候，前面的坐标给后一个，蛇头另算
		//从身体的最会一块算起，最后一块移动后的坐标是前一块每一栋之前的坐标
		var i = this.body.length - 1;
		for(; i > 0; i--) {
			//之所以大于0，是因为上面的算法不适用于蛇头，蛇头已经属于最前面，没有前面一块
			this.body[i].x = this.body[i - 1].x;
			this.body[i].y = this.body[i - 1].y;
		}
		//接下来讨论蛇头的方向，蛇头直接根据方向，横坐标加一或者纵坐标加一即可
		switch(this.direction) {
			case "right":
				this.body[0].x += 1;
				break;
			case "left":
				this.body[0].x -= 1;
				break;
			case "top":
				this.body[0].y -= 1;
				break;
			case "bottom":
				this.body[0].y += 1;
				break;
		}

		//判断有没有吃到食物
		//吃到食物了就是小蛇的头部坐标与食物的坐标一样
		var headX = this.body[0].x * this.width;
		var headY = this.body[0].y * this.height;
		//判断是否吃到了食物
		if(headX == food.x && headY == food.y) {
			//吃到食物之后，将小蛇的尾巴复制一份，加到最后，成为新的尾巴
			//获取小蛇的尾巴
			var last = this.body[this.body.length - 1];
			//body是一个数组，因此可以使用push将尾巴加到Body的最后
			this.body.push({
				x: last.x,
				y: last.y,
				color: last.color
			});
			//吃到食物之后，将食物删除，重新产生一个食物
			food.init(map);
		}
	};

	//删除小蛇
	function remove() {
		//获取数组
		var i = elements.length - 1; //从蛇尾开始删除
		for(; i >= 0; i--) {
			//
			var ele = elements[i];
			//先从父级元素中删除小蛇
			ele.parentNode.removeChild(ele);
			//再从数组中删除
			elements.splice(i, 1);
		}
	}
	//将构造函数Snake暴露给window，成为全局函数
	window.Snake = Snake;
}());